package Q5_03_Flip_Bit_to_Win; import java.util.ArrayList; public class QuestionB { public static int longestSequence(int n) { if (n == -1) return Integer.BYTES * 8; ArrayList<Integer> sequences = getAlternatingSequences(n); return findLongestSequence(sequences); } /* Return a list of the sizes of the sequences. The sequence starts * off with the number of 0s (which might be 0) and then alternates * with the counts of each value.*/ public static ArrayList<Integer> getAlternatingSequences(int n) { ArrayList<Integer> sequences = new ArrayList<Integer>(); int searchingFor = 0; int counter = 0; for (int i = 0; i < Integer.BYTES * 8; i++) { if ((n & 1) != searchingFor) { sequences.add(counter); searchingFor = n & 1; // Flip 1 to 0 or 0 to 1 counter = 0; } counter++; n >>>= 1; } sequences.add(counter); return sequences; } public static int findLongestSequence(ArrayList<Integer> seq) { int maxSeq = 1; for (int i = 0; i < seq.size(); i += 2) { int zerosSeq = seq.get(i); int onesSeqRight = i - 1 >= 0 ? seq.get(i - 1) : 0; int onesSeqLeft = i + 1 < seq.size() ? seq.get(i + 1) : 0; int thisSeq = 0; if (zerosSeq == 1) { // Can merge thisSeq = onesSeqLeft + 1 + onesSeqRight; } if (zerosSeq > 1) { // Just add a zero to either side thisSeq = 1 + Math.max(onesSeqRight, onesSeqLeft); } else if (zerosSeq == 0) { // No zero, but take either side thisSeq = Math.max(onesSeqRight, onesSeqLeft); } maxSeq = Math.max(thisSeq, maxSeq); } return maxSeq; } public static void main(String[] args) { int original_number = 1775; int new_number = longestSequence(original_number); System.out.println(Integer.toBinaryString(original_number)); System.out.println(new_number); } }